package com.controller;

import com.entity.Admin;
import com.entity.User;
import com.service.AdminService;
import com.service.UserService;
import com.utils.MD5Util;
import com.utils.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
public class AdminController {

    @Autowired
    private AdminService adminService;
    @Autowired
    private UserService userService;

    /**
     * 管理员登录业务
     *
     * @param admin
     * @return
     */
    @RequestMapping(value = "/admin.do", method = RequestMethod.POST)
    public String adminLogin(Admin admin, HttpSession session) {
        admin.setPassword(MD5Util.MD5(admin.getPassword()));
        Admin result = adminService.adminLogin(admin);
        if (result != null) {
            session.setAttribute("admin", result);
            return "/admin/adminIndex";
        } else {
            return "/admin/adminLogin";
        }
    }

    /**
     * 用户注销登录
     *
     * @param session
     * @param sessionStatus
     * @return
     */
    @RequestMapping("/adminOutLogin.do")
    public String adminOutLogin(HttpSession session, SessionStatus sessionStatus) {
        session.removeAttribute("admin");
        session.invalidate();
        sessionStatus.setComplete();
        return "/admin/adminLogin";
    }
    /**
     * 管理员 - 用户列表分页
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/adminListUser.do")
    public ModelAndView adminListUser(HttpServletRequest request, HttpServletResponse response) {
        //new一个ModelAndView对象,通过addObject存储page和用户list 并利用setViewName设定跳转页面
        ModelAndView modelView = new ModelAndView();
        int start = 0;  //初始化开始数据的索引 也就是所在页面的第一行 如第一页第一行是第0条，第二页第一行是第10条 以此类推
        int count = 10; //每页显示的条目数
        try {
            start = Integer.parseInt(request.getParameter("page.start"));  //从前台获取 开始数据的索引
            count = Integer.parseInt(request.getParameter("page.count"));  //从前台获取 每页显示的条目数
        } catch (Exception e) {
        }
        Page page = new Page(start, count); //将得到的值存入page对象中
        //从数据库中取值 将 start 和count 传入
        // 后台sql语句如下：
        // SELECT * FROM user LIMIT #{start}, #{和count}
        //第一个参数是开始数据的索引位置
        //第二个参数是要查询多少条数据
        //这里解释一下原理，每次从数据库中取出部分数据，可防止内存溢出
        List<User> userList = adminService.adminGetUserlist(page.getStart(), page.getCount());  //获取用户list

        // 后台sql语句如下
        // SELECT COUNT(*) FROM user
        //获取user表中用户总个数
        int total = adminService.adminGetUserTotal();
        page.setTotal(total);//设置page对象的总数据量

        //通过addObject存储page和用户list
        modelView.addObject("page", page);
        modelView.addObject("userList", userList);
        //利用setViewName设定跳转页面
        modelView.setViewName("admin/adminUserList");

        //返回ModelAndView对象 跳转
        return modelView;
    }

    /**
     * 管理员 - 模糊查询用户列表
     *
     * @param user
     * @return
     */
    @RequestMapping("/listUserVague.do")
    public String findUserVague(User user, HttpSession session) {
        List<User> user1 = userService.userFindUserVague(user);
        session.setAttribute("userList", user1);
        return "/admin/adminUserListVague";
    }

    /**
     * 管理员页面 - 用户列表 - 查看信息
     *
     * @param user
     * @param session
     * @return
     */
    @RequestMapping("/findUserInfo.do")
    public String findUserInfo(User user, HttpSession session) {
        User user1 = userService.userFindUser(user.getId());
        session.setAttribute("selectUser", user1);
        return "/admin/adminUserEdit";
    }

    /**
     * 管理员页面 - 用户列表 - 信息维护按钮提交
     *
     * @param user
     * @return
     */
    @RequestMapping("/adminDoUserEdit.do")
    public ModelAndView adminDoUserEdit(User user) {
        userService.userEdit(user);
        return new ModelAndView("redirect:/adminListUser.do");
    }

    /**
     * 管理员页面 - 用户列表 - 修改密码页面（首先得选择用户，获取id）
     *
     * @param user
     * @param session
     * @return
     */
    @RequestMapping("/adminUserPwd")
    public String adminUserPwd(User user, HttpSession session) {
        User user1 = userService.userFindUser(user.getId());
        session.setAttribute("selectUser", user1);
        return "/admin/adminUserPwd";
    }

    /**
     * 管理员页面 - 用户列表 - 修改密码
     *
     * @param user
     * @return
     */
    @RequestMapping("/adminUserPwd.do")
    public ModelAndView adminDoUserPwd(User user, HttpSession session) {
        User user1 = userService.userFindUser(user.getId());
        session.setAttribute("selectUser", user1);
        userService.userPwd(user.getId(), MD5Util.MD5(user.getPassword()));
        return new ModelAndView("redirect:/adminListUser.do");
    }

    /**
     * 管理员 - 用户列表 - 删除用户
     *
     * @param user
     * @return
     */
    @RequestMapping("/adminDelUser.do")
    public ModelAndView adminDelUser(User user) {
        adminService.adminDelUser(user);
        return new ModelAndView("redirect:/adminListUser.do");
    }

    /**
     * 管理员 - 添加用户
     *
     * @param user
     * @return
     */
    @RequestMapping("/adminAddUser.do")
    public ModelAndView adminAddUser(User user) {
        adminService.adminAddUser(user);
        return new ModelAndView("redirect:/adminListUser.do");
    }

    /**
     * 管理员解封用户
     * @param user
     * @return
     */
    @RequestMapping("/adminAuditStatus.do")
    public ModelAndView adminAuditStatus(User user){
        adminService.adminAuditStatus(user);
        return new ModelAndView("redirect:/adminListUser.do");
    }
    /**
     * 管理员封禁用户
     * @param user
     * @return
     */
    @RequestMapping("/adminBanStatus.do")
    public ModelAndView adminBanStatus(User user){
        adminService.adminBanStatus(user);
        return new ModelAndView("redirect:/adminListUser.do");
    }
}
